/**
 * TDesign Upload 组件的自定义上传处理器
 * 将图片上传到MinIO服务器
 */

import { uploadImageToMinio } from '../services/upload/imageUpload';

/**
 * 为 t-upload 组件创建自定义上传处理器
 * @param {string} uploadType 上传类型 'avatar' | 'image'
 * @returns {function} 上传处理函数
 */
export function createUploadHandler(uploadType = 'image') {
  return async function(files) {
    const uploadPromises = files.map(async (file) => {
      try {
        // 检查文件大小
        if (file.size > 10 * 1024 * 1024) {
          return {
            ...file,
            status: 'fail',
            error: '文件大小不能超过10MB'
          };
        }

        // 上传到MinIO
        const result = await uploadImageToMinio(file.url, uploadType);
        
        if (result.success) {
          return {
            ...file,
            url: result.url, // 使用MinIO返回的URL
            status: 'done',
            percent: 100
          };
        } else {
          return {
            ...file,
            status: 'fail',
            error: result.message || '上传失败'
          };
        }
      } catch (error) {
        return {
          ...file,
          status: 'fail',
          error: error.message || '上传异常'
        };
      }
    });

    return Promise.all(uploadPromises);
  };
}

/**
 * 处理 t-upload 组件的成功事件
 * @param {Event} e 事件对象
 * @param {function} callback 回调函数
 * @param {string} uploadType 上传类型
 */
export async function handleUploadSuccess(e, callback, uploadType = 'image') {
  const { files } = e.detail;
  
  // 显示上传进度
  wx.showLoading({
    title: '正在上传图片...',
  });

  try {
    // 过滤出需要上传的文件（本地文件）
    const filesToUpload = files.filter(file => 
      file.url && file.url.startsWith('http://tmp/') || file.url.startsWith('wxfile://')
    );
    
    const uploadPromises = filesToUpload.map(async (file) => {
      const result = await uploadImageToMinio(file.url, uploadType);
      if (result.success) {
        return {
          ...file,
          url: result.url,
          status: 'done'
        };
      } else {
        throw new Error(result.message || '上传失败');
      }
    });

    const uploadedFiles = await Promise.all(uploadPromises);
    
    // 更新文件列表
    const updatedFiles = files.map(file => {
      const uploaded = uploadedFiles.find(uploaded => uploaded.name === file.name);
      return uploaded || file;
    });

    wx.hideLoading();
    
    // 调用回调函数
    if (callback) {
      callback(updatedFiles);
    }

    console.log('批量上传完成，已存储到MinIO:', updatedFiles.map(f => f.url));
    
  } catch (error) {
    wx.hideLoading();
    wx.showToast({
      title: error.message || '上传失败',
      icon: 'none'
    });
    console.error('批量上传失败:', error);
  }
}

/**
 * 简化版：直接替换 handleSuccess 方法
 * @param {object} pageContext 页面上下文
 * @param {string} dataPath 数据路径，如 'uploadFiles' 或 'sessionFrom.rightsImageUrls'
 * @param {string} uploadType 上传类型
 */
export function createSimpleUploadHandler(pageContext, dataPath, uploadType = 'image') {
  return async function(e) {
    const { files } = e.detail;
    
    // 检查是否有新上传的文件需要处理
    const needUpload = files.some(file => 
      file.url && (file.url.startsWith('http://tmp/') || file.url.startsWith('wxfile://'))
    );

    if (!needUpload) {
      // 没有新文件，直接更新数据
      pageContext.setData({
        [dataPath]: files
      });
      return;
    }

    // 显示上传进度
    wx.showLoading({
      title: '正在上传到云存储...',
    });

    try {
      const processedFiles = await Promise.all(
        files.map(async (file) => {
          // 如果是本地文件，上传到MinIO
          if (file.url && (file.url.startsWith('http://tmp/') || file.url.startsWith('wxfile://'))) {
            const result = await uploadImageToMinio(file.url, uploadType);
            if (result.success) {
              return {
                ...file,
                url: result.url
              };
            } else {
              throw new Error(result.message || '上传失败');
            }
          }
          // 已经是网络地址，直接返回
          return file;
        })
      );

      wx.hideLoading();
      
      // 更新页面数据
      pageContext.setData({
        [dataPath]: processedFiles
      });

      console.log('图片已上传到MinIO:', processedFiles.map(f => f.url));

    } catch (error) {
      wx.hideLoading();
      wx.showToast({
        title: error.message || '上传失败',
        icon: 'none'
      });
      console.error('图片上传失败:', error);
    }
  };
}
